华为光猫HS8145V交叉编译静态tcpdump 您所在的位置:网站首页 dopra linux 命令 华为光猫HS8145V交叉编译静态tcpdump

华为光猫HS8145V交叉编译静态tcpdump

2023-06-03 13:52| 来源: 网络整理| 查看: 265

华为光猫HS8145V交叉编译静态tcpdump

编辑:狂族晨曦 来源:系统运维,经验杂笔 日期:2022-04-03 阅读: 886 次 5 条评论 » 百度已收录

先森是个网速强迫症,闲着没事就喜欢研究光猫、路由器那一套,还希望在任何地方只要有网就能控制家里的设备。可惜先森的电信光猫是大内网,双层NAT,没有ipv4公网IP,结果偶然先森发现家里设备都可以直连ipv6了,而且分配到设备的ipv6地址还是公网的,先森就想着使用ipv6来突破网络限制。

结果,运营商为了保证安全,默认是限制了ipv6入访的。

由于家里宽带不是先森办理的,先森不太方便直接将光猫改为桥接的模式,所幸是先森拿到了光猫超管密码,还可以通过shell的方式去操作iptables调整入访策略。但光猫的iptables策略特别多,先森也得为安全考虑,不能直接全放通,所以得进行测试。结果问题来了,光猫的shell中没有tcpdump的命令,没法抓包,让先森调试的心态爆炸,当时各种搜索都没有找到光猫抓包的方法。

由于ipv6的支持在先森身边依旧不是那么普遍,像先森公司的商纤就没有分配ipv6(不知道是不是公司IT把ipv6分配给关了),腾讯云CDN回源也不支持ipv6源站,所以当时先森一条条iptables策略调试的差不多之后,也就搁置了。但是没法运行tcpdump抓包这个事一直让先森如鲠在喉,然后最近突然知道了“交叉编译”这么一个玩意儿,让先森沉寂的心死灰复燃。

交叉编译:

交叉编译是在一个平台上生成另一个平台上的可执行代码。如在x86平台上编译ARM平台上运行的可执行代码。

先森在折腾的过程中遇到很多坑,在这里记录一下。

配置情况

光猫:华为HS8145V,已经开启telnet;

交叉编译主机:CentOS 7.9 x86_64,其实应该用Ubuntu来交叉编译更方便,但是先森对这系统不熟。

交叉编译器的寻找历程 确认平台

在网上搜交叉编译tcpdump的教程,一开始根本没注意到编译器,然后直接上手编译,这就跟平时正常编译一样,编译出来的是gcc编译的,根本不是交叉编译的。

网上教程说要确认目标机是arm-linux还是mips-linux什么的,先森看光猫通过telnet登录的时候有什么BusyBox、Dopra Linux,搜了一圈也没能明确搜出来华为光猫的系统属于什么,只是搜到有说华为光猫使用的是海思芯片,属于arm架构的,最后是`uname -m`确认到华为这个是arm平台。

选择arm-linux-gcc

确认了光猫HS8145V是arm后,目标就很明确了,下载一下交叉编译器,然后开整。

但先森万万没想到,arm-linux-gcc的下载链接那么难找,好不容易找到了,结果又发现arm-linux-gcc有很多版本,还要根据光猫arm的情况来选。

arm-linux-gcc的不同版本

那么光猫是什么情况呢,可以在命令行进行查看:

WAP(Dopra Linux) # uname -a Linux EchoLife_WAP 3.10.53-HULK2 #1 SMP Fri Oct 20 01:08:58 CST 2017 armv7l GNU/Linux

或者直接

WAP(Dopra Linux) # uname -m armv7l

实际在搜交叉编译的教程时,要不就是单纯的arm-linux-gcc,不然就是gcc-arm-linux-gnueabi和gcc-arm-linux-gnueabihf,所以就搜armv7l属于哪种。

百度了半天,好像都说armV7属于armhf,想来armv7l应该也是,但实测不行,还得是armel。

具体可以了解一下:

arm-linux-gnueabi-gcc 和 arm-linux-gnueabihf-gcc:

两个交叉编译器分别适用于 armel 和 armhf 两个不同的架构,armel 和 armhf 这两种架构在对待浮点运算采取了不同的策略(有 fpu 的 arm 才能支持这两种浮点运算策略)。

其实这两个交叉编译器只不过是 gcc 的选项 -mfloat-abi 的默认值不同。gcc 的选项 -mfloat-abi 有三种值 soft、softfp、hard(其中后两者都要求arm 里有 fpu 浮点运算单元,soft 与后两者是兼容的,但 softfp 和 hard 两种模式互不兼容):

soft: 不用fpu进行浮点计算,即使有fpu浮点运算单元也不用,而是使用软件模式。

softfp: armel架构(对应的编译器为 arm-linux-gnueabi-gcc )采用的默认值,用fpu计算,但是传参数用普通寄存器传,这样中断的时候,只需要保存普通寄存器,中断负荷小,但是参数需要转换成浮点的再计算。

hard: armhf架构(对应的编译器 arm-linux-gnueabihf-gcc )采用的默认值,用fpu计算,传参数也用fpu中的浮点寄存器传,省去了转换,性能最好,但是中断负荷高。

下载arm-linux-gcc

由于先森arm-linux-gcc的下载地址时比较痛苦,有点难找,所以显示把各种版本的链接在这里列一下。

下载单纯的arm-linux-gcc,版本较老,4.4.3貌似是2010年发布的了

资源地址:http://www.friendlyelec.com.cn/download.asp

在页面中可以找到下载地址:http://112.124.9.243/arm9net/mini2440/linux/arm-linux-gcc-4.4.3-20100728.tar.gz

下载arm-linux-gnueabi或arm-linux-gnueabihf,资源下载列表页是先选gcc版本,再选编译器架构,最后还要选架构运行平台,这里先森选的是最新版本latest-7中的arm-linux-gnueabi的64位系统版本。由于这个页面加载较慢或者未free无法打开,所以先森把两个版本的下载地址都贴出来:

资源列表页:http://releases.linaro.org/components/toolchain/binaries/

armel架构:http://124.156.146.205/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz

armhf架构:http://124.156.146.205/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi.tar.xz

配置arm-linux-gcc # 下载后解压 tar -xJvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi.tar.xz # 可选,先森是将其移动重命名了一下 mv gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi /usr/local/arm # 可选,但建议操作 cd /usr/local/arm/bin ln -s arm-linux-gnueabi-gcc arm-linux-gcc

建议增加环境变量,不然编译的时候./configure的参数需要加上'CC=/usr/local/arm/bin'

echo 'export PATH=$PATH:/usr/local/arm/bin' >> /etc/profile source /etc/profile

添加环境变量后,需要执行`arm-linux-gcc -v`测试一下arm-linux-gcc是否存在问题,可能会遇到下面的问题:

bin/.arm-none-linux-gnueabi-gcc: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory # 解决方法: yum install -y ld-linux.so.2

到这里终于把arm-linux-gcc部分弄完了,下面进入编译环节。

交叉编译libpcap和tcpdump

由于tcpdump需要依赖libpcap,所以需要下载这个包,分别编译,先森下载的最新版本:

https://www.tcpdump.org/release/tcpdump-4.99.1.tar.gz

https://www.tcpdump.org/release/libpcap-1.10.1.tar.gz

交叉编译libpcap

前面准备工作做好了,libpcap还是很好编译的。下载解压后,进入libpcap目录中:

./configure --prefix=/tmp/armroot --host=arm-linux --target=arm-linux --with-pcap=linux make make install # –prefix指定目标文件生成路径(makefile里面的target存放路径); # –host、–target都写成目标平台即可,例如:arm-liux或mips-linux,光猫是arm的,所以写arm-linux # --with-pcap将告诉编译器我们正在编译哪种数据包捕获类型 # 如果前面没有加arm-linux-gcc的环境变量,那么需要加上CC='/usr/local/arm/bin'编译链路径

编译时遇到的问题:

# 问题1: configure: error: Neither flex nor lex was found. # 解决: yum install -y flex bison # 问题2: /usr/local/arm/bin/../libexec/gcc/arm-none-linux-gnueabi/4.4.3/cc1: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory # 解决:貌似和系统是64位,gcc是32位有关,安装32位的库即可 yum install -y libstdc++.i686 # 问题3: /usr/local/arm/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.3/../../../../arm-none-linux-gnueabi/bin/as: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory # 解决: yum -y install zlib.i686

交叉编译tcpdump

实际测试,tcpdump的交叉编译,必须是编译静态链接,编译器默认是动态链接库。

由于光猫的根路径是只读的,而lib库就在系统路径中,无法在光猫添加确实的动态链接库文件,所以只能选择静态交叉编译这条路了。

解压tcpdump包后,进入目录进行操作:

# 指定静态交叉编译 export CFLAGS=-static export CPPFLAGS=-static export LDFLAGS=-static export ac_cv_linux_vers=3 ./configure --prefix=/tmp/armroot --host=arm-linux --target=arm-linux make make install # 编译好的文件就是当前目录下的tcpdump文件,也可以去--prefix执行的目录的bin或sbin目录找到tcpdump

编译tcpdump时遇到的问题:

# 问题1: configure: error: cannot determine linux version when cross-compiling # 解决办法:我们需要找出我们的 Ubuntu(或 Linux)操作系统内核正在运行的主要版本。执行 uname -a 命令。 # 注意:您的输出可能会有所不同,但请查找类似于版本号的内容。下面,先森的主机是 3.10.0-1160.45.1.el7.x86_64,我们抓住第一个“3”。 uname -a Linux VM-0-4-centos 3.10.0-1160.45.1.el7.x86_64 #1 SMP Wed Oct 13 17:20:51 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux # 然后将ac_cv_linux_vers 变量设置为上一个命令中发布的内核版本的主要编号,再尝试编译 export ac_cv_linux_vers=3 # 问题2: /mnt/jffs2/tcpdump: can't load library 'libc.so.6' # 解决:缺的动态链接库又没法塞进光猫的系统,所以需要静态交叉编译 # 问题3:静态编译会遇到此类警告 tcpdump.c:(.text+0x5a6): warning: Using 'initgroups' in statically linked applications requires at runtime the shared libraries from the glibc version used for linkin # 解决:正常现象,只是警告,不影响使用 建议操作

剥离符号信息,使二进制文件更小,这些符号仅在调试应用程序时有用,而光猫的存储容量比较小。

[root@VM-0-4-centos bin]# ll -h total 14M -rwxr-xr-x 1 root root 1.9K Apr  2 16:32 pcap-config -rwxr-xr-x 1 root root 6.9M Apr  2 16:33 tcpdump -rwxr-xr-x 1 root root 6.9M Apr  2 16:33 tcpdump.4.99.1 [root@VM-0-4-centos bin]# arm-linux-gnueabi-strip tcpdump [root@VM-0-4-centos bin]# ll -h total 8.4M -rwxr-xr-x 1 root root 1.9K Apr  2 16:32 pcap-config -rwxr-xr-x 1 root root 1.5M Apr  2 16:34 tcpdump -rwxr-xr-x 1 root root 6.9M Apr  2 16:33 tcpdump.4.99.1

拿到光猫上去运行

折腾了这么多,最终能在光猫上运行才是第一目标。

先森是直接把tcpdump放到服务器的web目录中,然后光猫直接wget下载到光猫中的。

先森在测试交叉编译的运行中,遇到了很多错误,总结下来是以下4种:

# 第一种报错 WAP(Dopra Linux) # ./tcpdump.Ullegal  Illegal instruction # 第二种报错 WAP(Dopra Linux) # ./tcpdump.libc  /mnt/jffs2/tcpdump.libc: can't load library 'libc.so.6' # 第三种报错 WAP(Dopra Linux) # ./tcpdump.0\:08  /mnt/jffs2/tcpdump.0:08: can't resolve symbol '__libc_start_main' # 第四种报错 WAP(Dopra Linux) # ./android-tcpdump  android-tcpdump: eth0: You don't have permission to capture on that device (socket: Operation not permitted)

事实上,除了第四种,前三种都是编译有问题的版本,第四种只是提醒没有权限执行。

没有权限的情况,经过一番搜索,先森找到了再次提权的方法(本来以为shell提权已经是终点了),二次提权只需要su切到root,密码:admin,可以通过whoami查看当前角色。

二次提权后执行成功

写在最后

本来先森是想在文章最后把自己编译好的文件分享出来的,结果在完善本文的时候搜到了一篇Android官方写的tcpdump静态交叉编译的文档,其中有详细的静态编译步骤,也有官方编译好的文件下载地址。先森试了一下,直接下载Android官方编译的tcpdump也是能够在光猫运行的,如果先森一开始就搜到了这边文档或资源。。。。

文档地址:https://www.androidtcpdump.com/android-tcpdump/compile

直接下载:https://www.androidtcpdump.com/android-tcpdump/downloads

历史上的今天:2016:  关于图片img的width和height的一些心得(0) 赞 (0) 标签: 光猫 路由器 Linux 除特别注明外,本站所有文章均为成航先森 www.capjsj.cn 原创,本文共7051个字 转载请注明出处来自https://www.capjsj.cn/arm_linux_gcc_tcpdump.html 上一篇: 解决连接Aria2出现net::ERR_FAILED的问题下一篇: 使用python破解电信宽带密码


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有